unit clsItem_Maquina;

interface

uses dm, dbtables, biblio, controls, sysutils, Db, RxMemDS;

type
  Reg_ProdTempo = record
    data: tdatetime;
    h_ini,
      h_fim: ttime;
    qtde: double;
  end;

type
  TVet_ProdTempo = array of Reg_ProdTempo;

type
  TItem_Maquina = class(TObject)
  public
    prod_numero: string;
    pro_codigo: string;
    sequencia: string;
    tipo_imq: string; // ==>   0 - Produzido
    cod_causa: string; //       1 - Retrabalho
    cod_maquina: string; //       2 - Perdido
    data_imq: TDateTime; //       3 - Tempo Parada
    HoraIni_Imq: string; //       4 - Reaproveitado
    HoraTer_Imq: string;
    QtdeProd_Imq: double;
    QtdeRef_imq: double;
    Num_Planilha: string;
    inspecao: string;
    resp_inspecao: string;
    tipo_cadastro: string; //  0 - Movto de Maqna  1 - Informe de Pecas  2 - Informe de CEP
    num_palete: string;
    dep_codigo: string;
    procedure Gravar(Num_Planilha: string; P_lancamento_imq: int64);
    function Recuperar(Num_Planilha: string; var tq, tq1: TQuery): boolean;
    function Recuperar1(Num_Planilha: string; var tq: TQuery): boolean;
    function Recuperar2(Num_Planilha: string): boolean;
    function Recuperar_Controle(Num_Planilha, Prod_Numero: string): byte;
    procedure Recuperar_PecaControle(Num_Planilha, Prod_Numero, Pro_Codigo, Sequencia: string; var tq: TQuery);
    function Recuperar_maior: string;
    function Ultimo_Lancto(Num_Planilha: string): int64;
    procedure Custo_Producao(Pro_Codigo: string; var tempo_medio, hora_m, hora_h: double);
    procedure Soma_CustoProducao(Pro_Codigo: string; var tempo_medio, hora_m, hora_h: double);
    procedure Calcula_CustoProducao(Pro_Codigo: string; p_DataIni, p_DataFim: TDateTime; var tempo_medio, hora_m, hora_h: double; var md: TRxMemoryData);
    procedure Soma_CustoProducao1(Pro_Codigo: string; p_DataIni, p_DataFim: TDateTime; var tempo_medio, hora_m, hora_h: double; var md: TRxMemoryData);
    procedure Excluir(Num_Planilha: string);
    procedure Consultar(P_data_imq: TDateTime; var p_q: TQuery);
  private
    procedure Ordenar_Vetor(var vetor: TVet_ProdTempo);
    procedure Valida_Vetor(var vetor: TVet_ProdTempo);
    procedure Calcular_Tempo(vetor: TVet_ProdTempo; var tempo_medio: TTime);
  end;

implementation

uses
  clsFichaProduto, clsItemProducao, clsFicha, clsProduto, clsItem_ProdMaquina,
  clsMaquina, clsItOp_Cep, cad_ItemMaquina;

var
  ficha: TFicha;
  wtq: TQuery;
  maquina: TMaquina;
  mov_ope: TItOp_Cep;
  vet_pt: TVet_ProdTempo;

  { TItem_Maquina }

procedure TItem_Maquina.Consultar;
begin
  p_q.close;
  p_q.SQL.clear;
  p_q.Params.clear;
  p_q.sql.add('select distinct i.Num_Planilha,i.data_imq,m.descricao_maquina from ' +
    'item_maquina i,maquina m where i.data_imq>=:a and m.cod_maquina=i.cod_maquina');
  p_q.params[0].asdatetime := P_data_imq;
  p_q.open;
end;

procedure TItem_Maquina.Custo_Producao;
var
  cont,
    xtempo,
    xtempo_m,
    xhora_h,
    xhora_m,
    xvl_h: double;
begin
  maquina := TMaquina.Create;
  mov_ope := TItOp_Cep.Create;
  ficha := TFicha.Create;
  wtq := TQuery.create(DmInt);
  wtq.DatabaseName := DmInt.Db.DatabaseName;
  wtq.Active := false;
  wtq.sql.clear;
  wtq.Params.clear;
  wtq.sql.add('Select * from Item_maquina where Pro_Codigo=:a');
  wtq.params[0].asstring := Pro_Codigo;
  wtq.open;
  setlength(vet_pt, 0);
  if not wtq.eof then begin
    cont := 0;
    xtempo_m := 0;
    xhora_h := 0;
    xhora_m := 0;
    while not wtq.eof do begin

      setlength(vet_pt, length(vet_pt) + 1);
      vet_pt[length(vet_pt) - 1].data := wtq.fieldbyname('data_Imq').asdatetime;
      vet_pt[length(vet_pt) - 1].h_ini := wtq.fieldbyname('HoraIni_Imq').asdatetime;
      vet_pt[length(vet_pt) - 1].h_fim := wtq.fieldbyname('HoraTer_Imq').asdatetime;
      vet_pt[length(vet_pt) - 1].qtde := wtq.fieldbyname('QtdeProd_Imq').asfloat;

      maquina.Recuperar(wtq.fieldbyname('Cod_Maquina').asstring);
      xtempo := (wtq.fieldbyname('HoraTer_Imq').asdatetime - wtq.fieldbyname('HoraIni_Imq').asdatetime);
      xhora_m := xhora_m + (maquina.Custo_Hora * (xtempo * 24));
      xvl_h := 0;
      mov_ope.Custo_Homem(wtq.fieldbyname('Num_Planilha').asstring, wtq.fieldbyname('lancamento_imq').asinteger, xtempo, xvl_h);
      xhora_h := xhora_h + xvl_h;
      xtempo_m := xtempo_m + xtempo;
      cont := cont + wtq.fieldbyname('QtdeProd_Imq').asfloat;
      wtq.next;
    end;
    if cont = 0 then cont := 1;
    hora_h := hora_h + (xhora_h / cont);
    hora_m := hora_m + (xhora_m / cont);
    tempo_medio := tempo_medio + (xtempo_m / cont);
  end;
  Soma_CustoProducao(Pro_Codigo, tempo_medio, hora_m, hora_h);
  // Ordenar_Vetor(vet_pt);
  // Calcular_Tempo(vet_pt,tempo_medio);
  ficha.free;
  mov_ope.free;
  maquina.free;
  wtq.close;
  wtq.free;
end;

procedure TItem_Maquina.Excluir;
var
  tq: TQuery;
  fichaproduto: TFichaProduto;
  itemproducao: TItemProducao;
  item_prodmaq: TItem_ProdMaquina;
  produto: TProduto;
begin
  tq := TQuery.create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := false;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Select * from item_maquina where Num_Planilha=:a and tipo_imq in (:b,:c)');
  tq.params[0].asstring := Num_Planilha;
  tq.params[1].asstring := '0'; // Produzido
  tq.params[2].asstring := '2'; // Perdido
  tq.open;
  fichaproduto := TFichaProduto.Create;
  itemproducao := TItemProducao.Create;
  item_prodmaq := TItem_ProdMaquina.Create;
  produto := TProduto.Create;
  ficha := TFicha.Create;
  while not tq.eof do begin
    if tq.fieldbyname('Prod_Numero').asstring <> '' then begin
      if tq.fieldbyname('tipo_imq').asstring = '0' then begin
        fichaproduto.Excluir_Informe(tq.fieldbyname('Prod_Numero').asstring, tq.fieldbyname('Pro_Codigo').asstring, tq.fieldbyname('Sequencia').asstring, tq.fieldbyname('data_imq').asdatetime);
        item_prodmaq.Recuperar(tq.fieldbyname('Prod_Numero').asstring, tq.fieldbyname('Pro_Codigo').asstring, tq.fieldbyname('Sequencia').asstring, tq.fieldbyname('Cod_Maquina').asstring);
        item_prodmaq.Quantidade := item_prodmaq.Quantidade + tq.fieldbyname('QtdeProd_Imq').asfloat;
        item_prodmaq.Gravar(tq.fieldbyname('Prod_Numero').asstring, tq.fieldbyname('Pro_Codigo').asstring, tq.fieldbyname('Sequencia').asstring, tq.fieldbyname('Cod_Maquina').asstring);
        if itemproducao.Recuperar_Item(tq.fieldbyname('Prod_Numero').asstring, tq.fieldbyname('Pro_Codigo').asstring, tq.fieldbyname('Sequencia').asstring) then begin
          itemproducao.Itp_QtdeProduzida := itemproducao.Itp_QtdeProduzida - tq.fieldbyname('QtdeProd_Imq').asfloat;
          itemproducao.Gravar(tq.fieldbyname('Prod_Numero').asstring, tq.fieldbyname('Pro_Codigo').asstring, tq.fieldbyname('Sequencia').asstring);
        end;
        produto.Tira_Saldo(tq.fieldbyname('Pro_Codigo').asstring, tq.fieldbyname('QtdeProd_Imq').asfloat, 0);
      end;
      if (gDeletando) then begin
        ficha.Aumenta_Saldo2(tq.fieldbyname('Prod_Numero').asstring, tq.fieldbyname('Pro_Codigo').asstring, tq.fieldbyname('Sequencia').asstring, tq.fieldbyname('QtdeProd_Imq').asfloat, tq.fieldbyname('data_imq').asdatetime);
      end else begin
        ficha.Aumenta_Saldo(tq.fieldbyname('Prod_Numero').asstring, tq.fieldbyname('Pro_Codigo').asstring, tq.fieldbyname('Sequencia').asstring, tq.fieldbyname('QtdeProd_Imq').asfloat, tq.fieldbyname('data_imq').asdatetime);
      end;
      itemproducao.Verificar_ProducaoTotal(tq.fieldbyname('Prod_Numero').asstring, tq.fieldbyname('Pro_Codigo').asstring, tq.fieldbyname('Sequencia').asstring, tq.fieldbyname('data_imq').asdatetime);
    end;
    tq.next;
  end;
  fichaproduto.free;
  itemproducao.free;
  item_prodmaq.free;
  produto.free;
  ficha.free;
  tq.close;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Delete from item_maquina where Num_Planilha=:a');
  tq.params[0].asstring := Num_Planilha;
  tq.ExecSQL;
  tq.close;
  tq.free;
end;

procedure TItem_Maquina.Gravar;
var
  tq: TQuery;
begin
  tq := TQuery.create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := false;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Select * from Item_maquina where Num_Planilha=:a and lancamento_imq=:b');
  tq.params[0].asstring := Num_Planilha;
  tq.params[1].AsInteger := P_lancamento_imq;
  tq.open;
  if tq.eof then begin
    tq.close;
    tq.SQL.clear;
    tq.Params.clear;
    tq.sql.add('insert into item_maquina values (:k_Num_Planilha,:K_lancamento_imq,');
    if prod_numero <> '' then tq.sql.add(':K_prod_numero,') else tq.sql.add('null,');
    if pro_codigo <> '' then tq.sql.add(':K_pro_codigo,') else tq.sql.add('null,');
    if sequencia <> '' then tq.sql.add(':K_sequencia,') else tq.sql.add('null,');
    if tipo_imq <> '' then tq.sql.add(':K_tipo_imq,') else tq.sql.add('null,');
    if cod_causa <> '' then tq.sql.add(':K_cod_causa,') else tq.sql.add('null,');
    if cod_maquina <> '' then tq.sql.add(':K_cod_maquina,') else tq.sql.add('null,');
    tq.sql.add(':K_data_imq,');
    if HoraIni_Imq <> '' then tq.sql.add(':K_HoraIni_imq,') else tq.sql.add('null,');
    if HoraTer_Imq <> '' then tq.sql.add(':K_HoraTer_imq,') else tq.sql.add('null,');
    if QtdeProd_Imq <> 0 then tq.sql.add(':K_QtdeProd_Imq,') else tq.sql.add('null,');
    if QtdeRef_imq <> 0 then tq.sql.add(':K_QtdeRef_imq,') else tq.sql.add('null,');
    tq.sql.add(':K_inspecao,');
    tq.sql.add(':K_resp_inspecao,');
    tq.sql.add(':K_tipo_cadastro,');
    tq.sql.add(':K_num_palete,');
    if dep_codigo <> '' then tq.sql.add(':K_dep_codigo)') else tq.sql.add('null)');
  end else begin
    tq.close;
    tq.sql.clear;
    tq.Params.clear;
    tq.sql.add('Update item_maquina set ');
    if prod_numero <> '' then tq.sql.add('prod_numero=:K_prod_numero,') else tq.sql.add('prod_numero=null,');
    if pro_codigo <> '' then tq.sql.add('pro_codigo=:K_pro_codigo,') else tq.sql.add('pro_codigo=null,');
    if sequencia <> '' then tq.sql.add('sequencia=:K_sequencia,') else tq.sql.add('sequencia=null,');
    if tipo_imq <> '' then tq.sql.add('tipo_imq=:K_tipo_imq,') else tq.sql.add('tipo_imq=null,');
    if cod_causa <> '' then tq.sql.add('cod_causa=:K_cod_causa,') else tq.sql.add('cod_causa=null,');
    if cod_maquina <> '' then tq.sql.add('cod_maquina=:K_cod_maquina,') else tq.sql.add('cod_maquina=null,');
    tq.sql.add('data_imq=:K_data_imq,');
    if HoraIni_Imq <> '' then tq.sql.add('HoraIni_imq=:K_HoraIni_imq,') else tq.sql.add('HoraIni_imq=null,');
    if HoraTer_Imq <> '' then tq.sql.add('HoraTer_imq=:K_HoraTer_imq,') else tq.sql.add('HoraTer_imq=null,');
    if QtdeProd_Imq <> 0 then tq.sql.add('QtdeProd_Imq=:K_QtdeProd_Imq,') else tq.sql.add('QtdeProd_Imq=null,');
    if QtdeRef_imq <> 0 then tq.sql.add('QtdeRef_imq=:K_QtdeRef_imq,') else tq.sql.add('QtdeRef_imq=null,');
    tq.sql.add('inspecao=:K_inspecao,');
    tq.sql.add('resp_inspecao=:K_resp_inspecao,');
    tq.sql.add('tipo_cadastro=:K_tipo_cadastro,');
    tq.sql.add('num_palete=:K_num_palete,');
    if dep_codigo <> '' then tq.sql.add('dep_codigo=:K_dep_codigo ') else tq.sql.add('dep_codigo=null ');
    tq.sql.add('Where Num_Planilha=:k_Num_Planilha and lancamento_imq=:K_lancamento_imq');
  end;
  tq.ParamByName('k_Num_Planilha').asstring := Num_Planilha;
  tq.ParamByName('K_lancamento_imq').AsInteger := P_lancamento_imq;
  if prod_numero <> '' then tq.ParamByName('K_prod_numero').AsString := prod_numero;
  if pro_codigo <> '' then tq.ParamByName('K_pro_codigo').AsString := pro_codigo;
  if sequencia <> '' then tq.ParamByName('K_sequencia').AsString := sequencia;
  if tipo_imq <> '' then tq.ParamByName('K_tipo_imq').AsString := tipo_imq;
  if cod_causa <> '' then tq.ParamByName('K_cod_causa').AsString := cod_causa;
  if cod_maquina <> '' then tq.ParamByName('K_cod_maquina').AsString := cod_maquina;
  tq.ParamByName('K_data_imq').AsDate := data_imq;
  if HoraIni_Imq <> '' then tq.ParamByName('K_HoraIni_imq').AsString := HoraIni_imq;
  if HoraTer_Imq <> '' then tq.ParamByName('K_HoraTer_imq').AsString := HoraTer_imq;
  if QtdeProd_Imq <> 0 then tq.ParamByName('K_QtdeProd_Imq').AsFloat := QtdeProd_Imq;
  if QtdeRef_imq <> 0 then tq.ParamByName('K_QtdeRef_imq').AsFloat := QtdeRef_imq;
  tq.ParamByName('K_inspecao').AsString := inspecao;
  tq.ParamByName('K_resp_inspecao').AsString := resp_inspecao;
  tq.ParamByName('K_tipo_cadastro').AsString := tipo_cadastro;
  tq.ParamByName('K_num_palete').AsString := num_palete;
  if dep_codigo <> '' then tq.ParamByName('K_dep_codigo').AsString := dep_codigo;
  tq.ExecSQL;
  tq.close;
  tq.free;
end;

function TItem_Maquina.Recuperar;
begin
  tq.close;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Select * from Item_maquina where Num_Planilha=:a and tipo_imq<>:b');
  tq.params[0].asstring := Num_Planilha;
  tq.params[1].asstring := '3';
  tq.open;
  result := not tq.eof;
  tipo_imq := tq.fieldbyname('tipo_imq').AsString;
  QtdeProd_Imq := tq.fieldbyname('QtdeProd_Imq').AsFloat;
  QtdeRef_imq := tq.fieldbyname('QtdeRef_imq').AsFloat;
  data_imq := tq.fieldbyname('data_imq').AsDateTime;
  prod_numero := tq.fieldbyname('prod_numero').AsString;
  pro_codigo := tq.fieldbyname('pro_codigo').AsString;
  sequencia := tq.fieldbyname('sequencia').AsString;
  cod_causa := tq.fieldbyname('cod_causa').AsString;
  cod_maquina := tq.fieldbyname('cod_maquina').AsString;
  HoraIni_Imq := tq.fieldbyname('HoraIni_Imq').AsString;
  HoraTer_Imq := tq.fieldbyname('HoraTer_Imq').AsString;
  inspecao := tq.fieldByName('inspecao').AsString;
  resp_inspecao := tq.fieldByName('resp_inspecao').AsString;
  tipo_cadastro := tq.fieldByName('tipo_cadastro').AsString;
  num_palete := tq.fieldByName('num_palete').AsString;
  dep_codigo := tq.fieldByName('dep_codigo').AsString;
  tq1.close;
  tq1.sql.clear;
  tq1.Params.clear;
  tq1.sql.add('Select * from Item_maquina where Num_Planilha=:a and tipo_imq=:b');
  tq1.params[0].asstring := Num_Planilha;
  tq1.params[1].asstring := '3';
  tq1.open;
end;

function TItem_Maquina.Recuperar1;
begin
  tq.close;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Select * from Item_maquina where Num_Planilha=:a');
  tq.params[0].asstring := Num_Planilha;
  tq.open;
  result := not tq.eof;
  tipo_imq := tq.fieldbyname('tipo_imq').AsString;
  QtdeProd_Imq := tq.fieldbyname('QtdeProd_Imq').AsFloat;
  QtdeRef_imq := tq.fieldbyname('QtdeRef_imq').AsFloat;
  data_imq := tq.fieldbyname('data_imq').AsDateTime;
  prod_numero := tq.fieldbyname('prod_numero').AsString;
  pro_codigo := tq.fieldbyname('pro_codigo').AsString;
  sequencia := tq.fieldbyname('sequencia').AsString;
  cod_causa := tq.fieldbyname('cod_causa').AsString;
  cod_maquina := tq.fieldbyname('cod_maquina').AsString;
  HoraIni_Imq := tq.fieldbyname('HoraIni_Imq').AsString;
  HoraTer_Imq := tq.fieldbyname('HoraTer_Imq').AsString;
  inspecao := tq.fieldByName('inspecao').AsString;
  resp_inspecao := tq.fieldByName('resp_inspecao').AsString;
  tipo_cadastro := tq.fieldByName('tipo_cadastro').AsString;
  num_palete := tq.fieldByName('num_palete').AsString;
  dep_codigo := tq.fieldByName('dep_codigo').AsString;
end;

function TItem_Maquina.Recuperar2;
var
  tq: TQuery;
begin
  tq := TQuery.create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := false;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Select * from Item_maquina where Num_Planilha=:a');
  tq.params[0].asstring := Num_Planilha;
  tq.open;
  result := not tq.eof;
  tq.close;
  tq.free;
end;

function TItem_Maquina.Recuperar_Controle;
var
  tq: TQuery;
begin
  result := 0;
  tq := TQuery.create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := false;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Select * from Item_maquina where Num_Planilha=:a and Prod_Numero=:b');
  tq.params[0].asstring := Num_Planilha;
  tq.params[1].asstring := Prod_Numero;
  tq.open;
  if tq.eof then begin
    tq.close;
    tq.sql.clear;
    tq.Params.clear;
    tq.sql.add('Select * from Item_maquina where Num_Planilha=:a');
    tq.params[0].asstring := Num_Planilha;
    tq.open;
    if not tq.eof then begin
      if tq.fieldByName('tipo_cadastro').AsString = '0' then result := 1 else result := 2;
    end;
  end else begin
    if tq.fieldByName('tipo_cadastro').AsString = '0' then result := 1 else result := 2;
  end;
  pro_codigo := tq.fieldbyname('Pro_Codigo').asstring;
  sequencia := tq.fieldbyname('Sequencia').asstring;
  data_imq := tq.fieldbyname('data_imq').asdatetime;
  num_palete := tq.fieldbyname('num_palete').asstring;
  tq.close;
  tq.free;
end;

function TItem_Maquina.Recuperar_maior;
var
  tq: TQuery;
begin
  tq := TQuery.create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := false;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Select max(Num_Planilha) maior from Item_maquina');
  tq.open;
  if tq.fieldbyname('maior').isnull then
    Result := '0000000001'
  else
    Result := strzero(tq.fieldbyname('maior').AsInteger + 1, 10);
  tq.close;
  tq.free;
end;

procedure TItem_Maquina.Recuperar_PecaControle;
begin
  tq.close;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Select * from Item_maquina where Num_Planilha=:a and Prod_Numero=:b and ' +
    'Pro_Codigo=:c and Sequencia=:d');
  tq.params[0].asstring := Num_Planilha;
  tq.params[1].asstring := Prod_Numero;
  tq.params[2].asstring := Pro_Codigo;
  tq.params[3].asstring := Sequencia;
  tq.open;
end;

procedure TItem_Maquina.Soma_CustoProducao;
var
  cont,
    xtempo,
    xtempo_m,
    xhora_h,
    xhora_m,
    xvl_h: double;
  wtq1: TQuery;
begin
  wtq1 := TQuery.create(DmInt);
  wtq1.DatabaseName := DmInt.Db.DatabaseName;
  wtq1.Active := false;
  wtq1.sql.clear;
  wtq1.Params.clear;
  ficha.ConsultarProduto(Pro_Codigo, 0, wtq1);
  wtq1.open;
  while not wtq1.eof do begin
    wtq.close;
    wtq.sql.clear;
    wtq.Params.clear;
    wtq.sql.add('Select * from Item_maquina where Pro_Codigo=:a');
    wtq.params[0].asstring := wtq1.fieldbyname('Pro_Codigo2').asstring;
    wtq.open;
    if not wtq.eof then begin
      cont := 0;
      xtempo_m := 0;
      xhora_h := 0;
      xhora_m := 0;
      while not wtq.eof do begin

        setlength(vet_pt, length(vet_pt) + 1);
        vet_pt[length(vet_pt) - 1].data := wtq.fieldbyname('data_Imq').asdatetime;
        vet_pt[length(vet_pt) - 1].h_ini := wtq.fieldbyname('HoraIni_Imq').asdatetime;
        vet_pt[length(vet_pt) - 1].h_fim := wtq.fieldbyname('HoraTer_Imq').asdatetime;
        vet_pt[length(vet_pt) - 1].qtde := wtq.fieldbyname('QtdeProd_Imq').asfloat;

        maquina.Recuperar(wtq.fieldbyname('Cod_Maquina').asstring);
        xtempo := (wtq.fieldbyname('HoraTer_Imq').asdatetime - wtq.fieldbyname('HoraIni_Imq').asdatetime);
        xhora_m := xhora_m + (maquina.Custo_Hora * (xtempo * 24));
        xvl_h := 0;
        mov_ope.Custo_Homem(wtq.fieldbyname('Num_Planilha').asstring, wtq.fieldbyname('lancamento_imq').asinteger, xtempo, xvl_h);
        xhora_h := xhora_h + xvl_h;
        xtempo_m := xtempo_m + xtempo;
        cont := cont + wtq.fieldbyname('QtdeProd_Imq').asfloat;
        wtq.next;
      end;
      if cont = 0 then cont := 1;
      hora_h := hora_h + (xhora_h / cont);
      hora_m := hora_m + (xhora_m / cont);
      tempo_medio := tempo_medio + (xtempo_m / cont);
    end;
    Soma_CustoProducao(wtq1.fieldbyname('Pro_Codigo2').asstring, tempo_medio, hora_m, hora_h);
    wtq1.next;
  end;
  wtq1.close;
  wtq1.free;
end;

function TItem_Maquina.Ultimo_Lancto;
var
  tq: TQuery;
begin
  tq := TQuery.create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := false;
  tq.sql.clear;
  tq.Params.clear;
  tq.sql.add('Select max(lancamento_imq) ultimo from Item_maquina where Num_Planilha=:a');
  tq.params[0].asstring := Num_Planilha;
  tq.open;
  Result := tq.fieldbyname('ultimo').AsInteger + 1;
  tq.close;
  tq.free;
end;

procedure TItem_Maquina.Ordenar_Vetor;
var
  i: integer;
  xdata: tdatetime;
  xh_ini,
    xh_fim: ttime;
  xqtde: double;
begin
  for i := 0 to length(vetor) - 2 do begin
    if (vetor[i].data > vetor[i + 1].data) then begin
      xdata := vetor[i + 1].data;
      xh_ini := vetor[i + 1].h_ini;
      xh_fim := vetor[i + 1].h_fim;
      xqtde := vetor[i + 1].qtde;

      vetor[i + 1].data := vetor[i].data;
      vetor[i + 1].h_ini := vetor[i].h_ini;
      vetor[i + 1].h_fim := vetor[i].h_fim;
      vetor[i + 1].qtde := vetor[i].qtde;

      vetor[i].data := xdata;
      vetor[i].h_ini := xh_ini;
      vetor[i].h_fim := xh_fim;
      vetor[i].qtde := xqtde;
    end;
  end;
  Valida_Vetor(vetor);
end;

procedure TItem_Maquina.Valida_Vetor;
var
  xdata: tdatetime;
  xh_ini,
    xh_fim: ttime;
  xqtde: double;
  i: integer;
  achou: boolean;
  vet_aux: TVet_ProdTempo;
  ok: boolean;
begin
  xdata := 0;
  xh_ini := 0;
  xh_fim := 0;
  xqtde := 0;
  achou := false;
  ok := true;
  for i := 0 to length(vetor) - 2 do begin
    if (vetor[i].data > vetor[i + 1].data) then begin
      xdata := vetor[i + 1].data;
      xh_ini := vetor[i + 1].h_ini;
      xh_fim := vetor[i + 1].h_fim;
      xqtde := vetor[i + 1].qtde;
      achou := true;
    end;
  end;
  if achou then begin
    setlength(vet_aux, length(vetor));
    for i := 0 to length(vetor) - 1 do begin
      if i = 0 then begin
        vet_aux[0].data := xdata;
        vet_aux[0].h_ini := xh_ini;
        vet_aux[0].h_fim := xh_fim;
        vet_aux[0].qtde := xqtde;
      end else begin
        if vetor[i - 1].data = xdata then ok := false;
        if ok then begin
          vet_aux[i].data := vetor[i - 1].data;
          vet_aux[i].h_ini := vetor[i - 1].h_ini;
          vet_aux[i].h_fim := vetor[i - 1].h_fim;
          vet_aux[i].qtde := vetor[i - 1].qtde;
        end else begin
          vet_aux[i].data := vetor[i].data;
          vet_aux[i].h_ini := vetor[i].h_ini;
          vet_aux[i].h_fim := vetor[i].h_fim;
          vet_aux[i].qtde := vetor[i].qtde;
        end;
      end;
    end;
    for i := 0 to length(vetor) - 1 do begin
      vetor[i].data := vet_aux[i].data;
      vetor[i].h_ini := vet_aux[i].h_ini;
      vetor[i].h_fim := vet_aux[i].h_fim;
      vetor[i].qtde := vet_aux[i].qtde;
    end;
    Ordenar_Vetor(vetor);
  end;
end;

procedure TItem_Maquina.Calcular_Tempo;
var
  i: integer;
  xdata: tdatetime;
  xt_maior,
    xt_menor: ttime;
  xqtde: double;
begin
  tempo_medio := 0;
  xqtde := 0;
  xdata := vetor[0].data;
  xt_menor := 1;
  xt_maior := 0;
  for i := 0 to length(vetor) - 1 do begin
    if xdata <> vetor[i].data then begin
      if xqtde <= 0 then xqtde := 1;
      tempo_medio := tempo_medio + ((xt_maior - xt_menor) / xqtde);
      xt_menor := 1;
      xt_maior := 0;
      xqtde := 0;
    end;
    xdata := vetor[i].data;
    xqtde := xqtde + vetor[i].qtde;
    if (xt_menor > vetor[i].h_ini) and (vetor[i].h_ini <> strtotime('12:12')) then xt_menor := vetor[i].h_ini;
    if (xt_maior < vetor[i].h_fim) and (vetor[i].h_fim <> strtotime('12:12')) then xt_maior := vetor[i].h_fim;
  end;
  if xqtde <= 0 then xqtde := 1;
  tempo_medio := tempo_medio + ((xt_maior - xt_menor) / xqtde);
end;

procedure TItem_Maquina.Calcula_CustoProducao;
var
  cont,
    xtempo,
    xtempo_m,
    xhora_h,
    xhora_m,
    xvl_h: double;
begin
  maquina := TMaquina.Create;
  mov_ope := TItOp_Cep.Create;
  ficha := TFicha.Create;
  wtq := TQuery.create(DmInt);
  wtq.DatabaseName := DmInt.Db.DatabaseName;
  wtq.Active := false;
  wtq.sql.clear;
  wtq.Params.clear;
  wtq.sql.add('Select * from Item_maquina where Pro_Codigo=:a and data_imq>=:b and ' +
    'data_imq<=:c');
  wtq.params[0].asstring := Pro_Codigo;
  wtq.params[1].asdatetime := p_DataIni;
  wtq.params[2].asdatetime := p_DataFim;
  wtq.open;
  setlength(vet_pt, 0);
  if not wtq.eof then begin
    if not md.locate('Pro_Codigo', Pro_Codigo, []) then begin
      cont := 0;
      xtempo_m := 0;
      xhora_h := 0;
      xhora_m := 0;
      while not wtq.eof do begin

        //   setlength(vet_pt,length(vet_pt)+1);
        //   vet_pt[length(vet_pt)-1].data := wtq.fieldbyname('data_Imq').asdatetime;
        //   vet_pt[length(vet_pt)-1].h_ini:= wtq.fieldbyname('HoraIni_Imq').asdatetime;
        //   vet_pt[length(vet_pt)-1].h_fim:= wtq.fieldbyname('HoraTer_Imq').asdatetime;
        //   vet_pt[length(vet_pt)-1].qtde := wtq.fieldbyname('QtdeProd_Imq').asfloat;

        maquina.Recuperar(wtq.fieldbyname('Cod_Maquina').asstring);
        xtempo := (wtq.fieldbyname('HoraTer_Imq').asdatetime - wtq.fieldbyname('HoraIni_Imq').asdatetime);
        xhora_m := xhora_m + (maquina.Custo_Hora * (xtempo * 24));
        xvl_h := 0;
        mov_ope.Custo_Homem(wtq.fieldbyname('Num_Planilha').asstring, wtq.fieldbyname('lancamento_imq').asinteger, xtempo, xvl_h);
        xhora_h := xhora_h + xvl_h;
        xtempo_m := xtempo_m + xtempo;
        cont := cont + wtq.fieldbyname('QtdeProd_Imq').asfloat;
        wtq.next;
      end;
      if cont = 0 then cont := 1;
      hora_h := hora_h + (xhora_h / cont);
      hora_m := hora_m + (xhora_m / cont);
      tempo_medio := tempo_medio + (xtempo_m / cont);
      if (xtempo_m / cont) > 0 then begin
        md.insert;
        md.fieldbyname('Pro_Codigo').asstring := Pro_Codigo;
        md.fieldbyname('Tempo_Gasto').asfloat := xtempo_m / cont;
        md.fieldbyname('Custo_Maq').asfloat := xhora_m / cont;
        md.fieldbyname('Custo_Hom').asfloat := xhora_h / cont;
        md.post;
      end;
    end else begin
      hora_h := hora_h + md.fieldbyname('Custo_Hom').asfloat;
      hora_m := hora_m + md.fieldbyname('Custo_Maq').asfloat;
      tempo_medio := tempo_medio + md.fieldbyname('Tempo_Gasto').asfloat;
    end;
  end;
  Soma_CustoProducao1(Pro_Codigo, p_DataIni, p_DataFim, tempo_medio, hora_m, hora_h, md);
  // Ordenar_Vetor(vet_pt);
  // Calcular_Tempo(vet_pt,tempo_medio);
  ficha.free;
  mov_ope.free;
  maquina.free;
  wtq.close;
  wtq.free;
end;

procedure TItem_Maquina.Soma_CustoProducao1;
var
  cont,
    xtempo,
    xtempo_m,
    xhora_h,
    xhora_m,
    xvl_h: double;
  wtq1: TQuery;
begin
  wtq1 := TQuery.create(DmInt);
  wtq1.DatabaseName := DmInt.Db.DatabaseName;
  wtq1.Active := false;
  wtq1.sql.clear;
  wtq1.Params.clear;
  ficha.ConsultarProduto(Pro_Codigo, 0, wtq1);
  wtq1.open;
  while not wtq1.eof do begin
    if not md.locate('Pro_Codigo', wtq1.fieldbyname('Pro_Codigo2').asstring, []) then begin
      wtq.close;
      wtq.sql.clear;
      wtq.Params.clear;
      wtq.sql.add('Select * from Item_maquina where Pro_Codigo=:a and data_imq>=:b and ' +
        'data_imq<=:c');
      wtq.params[0].asstring := wtq1.fieldbyname('Pro_Codigo2').asstring;
      wtq.params[1].asdatetime := p_DataIni;
      wtq.params[2].asdatetime := p_DataFim;
      wtq.open;
      if not wtq.eof then begin
        cont := 0;
        xtempo_m := 0;
        xhora_h := 0;
        xhora_m := 0;
        while not wtq.eof do begin

          //    setlength(vet_pt,length(vet_pt)+1);
          //    vet_pt[length(vet_pt)-1].data := wtq.fieldbyname('data_Imq').asdatetime;
          //    vet_pt[length(vet_pt)-1].h_ini:= wtq.fieldbyname('HoraIni_Imq').asdatetime;
          //    vet_pt[length(vet_pt)-1].h_fim:= wtq.fieldbyname('HoraTer_Imq').asdatetime;
          //    vet_pt[length(vet_pt)-1].qtde := wtq.fieldbyname('QtdeProd_Imq').asfloat;

          maquina.Recuperar(wtq.fieldbyname('Cod_Maquina').asstring);
          xtempo := (wtq.fieldbyname('HoraTer_Imq').asdatetime - wtq.fieldbyname('HoraIni_Imq').asdatetime);
          xhora_m := xhora_m + (maquina.Custo_Hora * (xtempo * 24));
          xvl_h := 0;
          mov_ope.Custo_Homem(wtq.fieldbyname('Num_Planilha').asstring, wtq.fieldbyname('lancamento_imq').asinteger, xtempo, xvl_h);
          xhora_h := xhora_h + xvl_h;
          xtempo_m := xtempo_m + xtempo;
          cont := cont + wtq.fieldbyname('QtdeProd_Imq').asfloat;
          wtq.next;
        end;
        if cont = 0 then cont := 1;
        hora_h := hora_h + (xhora_h / cont);
        hora_m := hora_m + (xhora_m / cont);
        tempo_medio := tempo_medio + (xtempo_m / cont);
        if not md.locate('Pro_Codigo', wtq1.fieldbyname('Pro_Codigo2').asstring, []) then begin
          if (xtempo_m / cont) > 0 then begin
            md.insert;
            md.fieldbyname('Pro_Codigo').asstring := wtq1.fieldbyname('Pro_Codigo2').asstring;
            md.fieldbyname('Tempo_Gasto').asfloat := xtempo_m / cont;
            md.fieldbyname('Custo_Maq').asfloat := xhora_m / cont;
            md.fieldbyname('Custo_Hom').asfloat := xhora_h / cont;
            md.post;
          end;
        end;
      end;
    end else begin
      hora_h := hora_h + md.fieldbyname('Custo_Hom').asfloat;
      hora_m := hora_m + md.fieldbyname('Custo_Maq').asfloat;
      tempo_medio := tempo_medio + md.fieldbyname('Tempo_Gasto').asfloat;
    end;
    Soma_CustoProducao1(wtq1.fieldbyname('Pro_Codigo2').asstring, p_DataIni, p_DataFim, tempo_medio, hora_m, hora_h, md);
    wtq1.next;
  end;
  wtq1.close;
  wtq1.free;
end;

end.

